From 6c4592c40cb3652af3a2eeb0c06f3fd9f974f918 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C3=98yvind=20Kol=C3=A5s?= Date: Mon, 15 May 2017 22:05:21 +0200 Subject: [PATCH] extensions: add two fast paths from cairo formats This is to babls corresponding premultiplied but in different swizzling order 8bit and float data. --- extensions/cairo.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/extensions/cairo.c b/extensions/cairo.c index 5569ab6..6066258 100644 --- a/extensions/cairo.c +++ b/extensions/cairo.c @@ -104,6 +104,43 @@ conv_rgbA8_premul_cairo32_le (unsigned char *src, unsigned char *dst, long sampl } #endif +static long conv_cairo32_rgbA8_premul_le (unsigned char *src, unsigned char *dst, long samples) +{ + long n = samples; + while (n--) + { + unsigned char blue = *src++; + unsigned char green = *src++; + unsigned char red = *src++; + unsigned char alpha = *src++; + + *dst++ = red; + *dst++ = green; + *dst++ = blue; + *dst++ = alpha; + } + return samples; +} + + +static long conv_cairo32_rgbAF_premul_le (unsigned char *src, unsigned char *dst_char, long samples) +{ + long n = samples; + float *dst = (void*)dst_char; + while (n--) + { + unsigned char blue = *src++; + unsigned char green = *src++; + unsigned char red = *src++; + unsigned char alpha = *src++; + + *dst++ = red / 255.0; + *dst++ = green / 255.0; + *dst++ = blue / 255.0; + *dst++ = alpha / 255.0; + } + return samples; +} static inline long conv_rgbA8_cairo32_le (unsigned char *src, unsigned char *dst, long samples) @@ -359,6 +396,13 @@ init (void) babl_component ("PAD"), NULL ); + + babl_conversion_new (f32, babl_format ("R'aG'aB'aA float"), "linear", + conv_cairo32_rgbAF_premul_le, NULL); + + babl_conversion_new (f32, babl_format ("R'aG'aB'aA u8"), "linear", + conv_cairo32_rgbA8_premul_le, NULL); + babl_conversion_new (babl_format ("R'aG'aB'aA u8"), f32, "linear", conv_rgbA8_premul_cairo32_le, NULL); -- 2.30.2